package cn.fql.service.impl;

import cn.fql.service.IVerifyCodeService;
import cn.fql.ymcc.exception.BusinessException;

import cn.fql.ymcc.util.StrUtils;
import cn.fql.ymcc.util.VerifyCodeUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {

    @Autowired
    private RedisTemplate redisTemplate;
    /**图形验证码*/
    @Override
    public String getImgeCode(String key) {
        //通过工具类生成4位图形验证码
        String code = StrUtils.getComplexRandomString(4);
        //将key和图形验证码保存到Redis中:5分钟过期
        redisTemplate.opsForValue().set(key,code,5, TimeUnit.MINUTES);
        //将图形验证码写在图片中并且使用base64位编码
        String s = VerifyCodeUtils.verifyCode(100, 30, code);
        return s;
    }

    /**手机验证码*/
    @Override
    public void getSmsCode(Map<String, String> map) {
        //从map中获取到三个参数
        String phone = map.get("phone");//客户输入的手机号码
        String imgCode = map.get("imageCode");//客户输入的图形验证码
        String imgCodeKey = map.get("imageCodeKey");//保存到rides中的图形验证码的key
        //验证客户是否输入手机号码和图形验证码
        if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(imgCode)) {
            throw new BusinessException("数据不能为空!");
        }
        //验证图形验证码是否过期
        Object obj = redisTemplate.opsForValue().get(imgCodeKey);
        if (obj==null) {
            throw new BusinessException("图形验证码已经过期,请重新申请!");
        }
        //验证图形验证码是否正确 equalsIgnoreCase忽略大小写比对
        if(!imgCode.equalsIgnoreCase(obj.toString())){
            throw new BusinessException("图形验证码输入错误,请重新输入!");
        }

        //获取手机验证码
        Object phoneCodeobj = redisTemplate.opsForValue().get("register:" + phone);
        //定义一个String对象用来装没有验证码是获取的新验证码
        String code=null;
        //判断手机验证码是否过期或者是第一次获取
        if(phoneCodeobj==null){
            //过期//或者第一次获取
            //调用方法获取新的验证码
            code=StrUtils.getRandomString(4);
        }else{
            //没有过期,判断是否在重发时间内
            //先获取上一次的时间戳
            long oldTime = Long.parseLong(phoneCodeobj.toString().split(":")[1]);
            //再获取现在的时间
            long newTime = System.currentTimeMillis();
            //当新的时间进去旧时间小于规定的1分钟是
            if((newTime-oldTime)<1*60*1000){
                //提示客户不要重复获取验证码
                throw new BusinessException("请不要重复获取验证码!");
            }
            //然后验证码就使用没有过期的那个
            code=phoneCodeobj.toString().split(":")[0];
        }
        //将手机验证码保存到rides,3分钟有效
        redisTemplate.opsForValue().set("register:" + phone,code+":"+System.currentTimeMillis(),3,TimeUnit.MINUTES);
        //向客户手机发送验证码
        //SmsUtils.sendSms(phone,code+",请在3分钟内使用!");
        System.out.println(code+",请在3分钟内使用!");
    }
}
